#ifndef __IBL0903_H__
#define __IBL0903_H__
#include "stm32f10x.h"
// 只读寄存器  名称   地址          功能                     默认值
#define IA_FAST_RMS 0x00 // A 通道快速有效值，无符号        0x000000
#define IA_WAVE 0x01     // A 通道电流波形寄存器，有符号      0x000000
#define IB_WAVE 0x02     // B 通道电流波形寄存器，有符号       0x000000
#define V_WAVE 0x03      // 电压波形寄存器，有符号           0x000000
#define IA_RMS 0x04      // A 通道电流有效值寄存器，无符号      0x000000
#define IB_RMS 0x05      // B 通道电流有效值寄存器，无符号      0x000000
#define V_RMS 0x06       // 电压有效值寄存器，无符号          0x000000
#define IB_FAST_RMS 0x07 // B 通道快速有效值，无符号         0x000000
#define A_WATT 0x08      // A 通道有功功率寄存器，有符号       0x000000
#define B_WATT 0x09      // B 通道有功功率寄存器，有符号       0x000000
#define CFA_CNT 0x0A     // A 通道有功电能脉冲计数，无符号      0x000000
#define CFB_CNT 0x0B     // B 通道有功电能脉冲计数，无符号      0x000000
#define A_CORNER 0x0C    // A 通道电流电压波形相角寄存器       0x0000
#define B_CORNER 0x0D    // B 通道电流电压波形相角寄存器       0x0000
#define TPS1 0x0E        // B 通道电流电压波形相角寄存器       0x000
#define TPS2 0x0F        // 外部温度检测寄存器，无符号         0x000
// 读写寄存器
#define A_F_RMS_CTL 0x10 // A 通道快速有效值控制寄存器        0xFFFF
#define IA_RMSOS 0x13    // 电流 A 通道有效值小信号校正寄存器    0x00
#define IB_RMSOS 0x14    // 电流 B 通道有效值小信号校正寄存器    0x00
#define A_WATTOS 0x15    // A 通道有功功率小信号校正寄存器      0x00
#define B_WATTOS 0x16    // B 通道有功功率小信号校正寄存器      0x00
#define WA_CREEP 0x17    // 有功功率防潜寄存器                 0x0B
#define MODE 0x18        // 用户模式选择寄存器                 0x0000
#define SOFT_RESET 0x19  // 写入 0x5A5A5A时用户区寄存器复位      0x000000
#define USR_WRPROT 0x1A  // 写入 0x55后用户操作寄存器可以写入；  0x00
#define TPS_CTRL 0x1B    // 温度模式控制寄存器                 0x07FF
#define TPS2_A 0x1C      // 外部温度传感器增益系数校正寄存器      0x0000
#define TPS2_B 0x1D      // 外部温度传感器偏移系数校正寄存器      0x0000
#define B_F_RMS_CTL 0x1E // B 通道快速有效值控制寄存器        0xFFFF

#define RN_SENDMAX 10
#define RN_RECEMAX 10
#define RN_READ_DATA_LEN 4
#define TRUE 1
#define FALSE 0
#define BL0939_Addr_R 0x55
#define BL0939_Addr_w 0xA5


typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;
typedef uint8_t BOOL;
typedef uint8_t bool;

typedef enum
{
  RET_POW_SUC = 0,
  RET_POW_FAL
} Error_code_t;

typedef struct // 发送数据结构体
{
  u16 Len;             // 数据长度
  u8 Data[RN_SENDMAX]; // 发送数据缓存数组
} RN_SEND;

typedef struct // 接收数据结构体
{
  u16 Len;
  u8 Data[RN_RECEMAX];
} RN_RECE;

typedef struct
{
  uint64_t base_energy_pow; // 通道电量基数
  u32 last_energy_pow;      // 上次读到的电量基数
} BL0939_Para_t;
////bl0939_spi.h内容
typedef union
{
  u8 uByte[4];
  u16 uInt[2];
  u32 uLongs;
} FourBytes_Type;

typedef union
{
  u8 uByte[2];
  u16 uInt;
} TwoByte_Type;

// BL0939的电参数定义,考虑运算效率，数据都放大，做整数乘除法，忽略小数点 ok
typedef struct
{
  uint32_t Energy_kwh_B;    // 电流B 通道的实际用电量，千瓦小时 XXXXXX.XXX
  uint32_t Energy_kwh_A;    // 电流A 通道的实际用电量，千瓦小时 XXXXXX.XXX 
  uint32_t Fir_CFA_CNT;     // 上一次的CFA_CNT寄存器读数
  uint32_t Fir_CFB_CNT;     // 上一次的CFB_CNT寄存器读数
  uint32_t Mid_CFA_CNT;     // A 通道电能累积换算的中间变量
  uint32_t Mid_CFB_CNT;     // B 通道电能累积酸环的中间变量
  uint16_t Power_Value_A;   // unit:	0.1W	XXXX.X
  uint16_t Current_Value_A; // uint:	0.01A	XX.XX  数值*100
  uint16_t Voltage_Value;   // uint:0.1V		XXX.X
  uint16_t Current_Value_B; // uint:	0.001A	XX.XXX
  uint16_t Power_Value_B;   // unit:	0.1W	XXXX.X
  uint16_t v_TPS1;          // unit: 0.1℃ XX.X
  uint16_t v_TPS2;
  uint32_t Energy_kwh_A_xiaoshu;    // 电流A 通道的实际用电量，小数值 XXXXXX.XXX 
} Elect_StructDef;

extern Elect_StructDef BL0939_Elect;

extern TwoByte_Type Voltage_K;    // 电压转换系数
extern TwoByte_Type Current_K;    // 电流A 转换系数
extern TwoByte_Type Power_K;      // A 通道功率转换系数
extern TwoByte_Type LeakCur_K;    // 电流B 转换系数
extern TwoByte_Type Power_K_Leak; // B 通道功率转换系数
extern TwoByte_Type Energy_K;     // 电能脉冲计数，对应于1度电的脉冲计数


// BL0939_Para_t m_para[CHECK_CHANNELS];
void delay_nms(u16 n);
void BL0939_Parameter_Init(void);
// void BL_Config(void);//硬件配置
// void BL_GPIOconfig(void);
// void BL_Send(void);//串口发送
// BOOL BL_Write(u8 wreg, u8 *pbuf, u16 uclen,u8 ch);
// BOOL BL_Read(u8 wreg,u8 ch);
// BOOL Block_Rece(void);//阻塞接收+超时处理
// BOOL Block_Send(void);//阻塞发送+超时处理
// Error_code_t WriteData(u8 wreg, u8 *data, u8 len, u8 ch);
// Error_code_t ReadData(u8 wreg, u8 *data, u8 len, u8 ch);
// BOOL BLCheckSum(u8 reg, u8 *data, u8 ch);
// Error_code_t read_ch_pow(float* POW, u8 ch);
// Error_code_t read_ch_cur(u16* Cur, u8 ch);
// Error_code_t read_ch_vol(u16* Vol, u8 ch);
// Error_code_t get_device_id(const u32 m_ch);
// Error_code_t read_ch_energy_pow(u32* Energy_Pow, u8 ch);
// Error_code_t write_ch_oilvl(u16 Over_Cur, u8 ch);
// Error_code_t soft_reset(u8 ch);
// Error_code_t Init(u8 ch);
// Error_code_t set_powercheck_ic( const u32 m_ch);
// u32 calculate_energy(u8 ch, u32 ele);
extern Elect_StructDef BL0939_ReadEData(void);
extern u8 BL_Init(void);
extern u32 getCurrentEnergy_kwh_A(void);
extern u32 getCurrent_IA(void);
extern u32 getCurrent_V(void);
#endif
